VeraCrypt

文档 >> 技术细节 >> 头密钥推导、盐值和迭代次数

头密钥推导、盐值和迭代次数

头密钥用于加密和解密VeraCrypt卷头的加密区域(对于 系统加密,则是密钥数据区域),该区域包含主密钥和其他数据(请参阅 加密方案 VeraCrypt卷格式规范 部分)。在VeraCrypt创建的卷中(以及对于 系统加密),该区域采用XTS模式进行加密(请参阅 操作模式 部分)。VeraCrypt用于生成头密钥和辅助头密钥(XTS模式)的方法是PBKDF2,该方法在PKCS #5 v2.0中定义;请参阅 [7]
使用了512位的盐值,这意味着每个密码有2512 个密钥。这显著降低了对“离线”字典/“彩虹表”攻击的脆弱性(使用盐值时,为字典中的所有密码预先计算所有密钥非常困难) [7]。盐值由 VeraCrypt随机数生成器 在卷创建过程中生成的随机值组成。头密钥推导函数基于HMAC - SHA - 512、HMAC - SHA - 256、HMAC - BLAKE2S - 256、HMAC - Whirlpool或HMAC - Streebog(请参阅 [8, 9, 20, 22]) — 用户可以选择使用哪种。派生密钥的长度不取决于底层哈希函数的输出大小。例如,即使使用HMAC - SHA - 512,AES - 256密码的头密钥始终为256位长(在XTS模式下,还会使用一个额外的256位辅助头密钥;因此,AES - 256总共使用两个256位密钥)。更多信息,请参阅 [7]。为了推导出头密钥,必须执行大量的密钥推导函数迭代,这增加了进行密码穷举搜索(即暴力攻击)所需的时间 [7]。

在1.12版本之前,VeraCrypt始终使用固定的迭代次数,该次数仅取决于卷类型和使用的推导算法。 从1.12版本开始, PIM 字段(个人迭代乘数)使用户能够更好地控制密钥推导函数使用的迭代次数。

当未指定 PIM 值或该值等于零时,VeraCrypt使用以下默认值:

当用户提供 PIM 值时,密钥推导函数的迭代次数计算如下:

级联密码中使用的头密钥相互独立,即使它们是从单个密码(可能已应用密钥文件)派生而来。例如,对于AES - Twofish - Serpent级联,头密钥推导函数会根据给定密码推导出一个768位的加密密钥(在XTS模式下,还会从给定密码推导出一个768位的 辅助 头密钥)。生成的768位头密钥随后被拆分为三个256位密钥(在XTS模式下, 辅助 头密钥也被拆分为三个256位密钥,因此级联实际上总共使用六个256位密钥),其中第一个密钥由Serpent使用,第二个密钥由Twofish使用,第三个密钥由AES使用(此外,在XTS模式下,第一个辅助密钥由Serpent使用,第二个辅助密钥由Twofish使用,第三个辅助密钥由AES使用)。因此,即使攻击者拥有其中一个密钥,他也无法使用该密钥推导出其他密钥,因为除了对弱密码进行暴力攻击外,没有可行的方法来确定派生该密钥的密码。
下一部分 >>